package com.cskaoyan._03innerclazz._06lambda._02advance;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/14 10:04
 **/
/*

逐个部分简化：

1. (形参列表)能不能简化呢？是可以的，因为功能接口中有且仅有一个必须要实现的抽象方法，
那么：

   1. 形参的数据类型是可以省略的，因为方法已经固定死了，形参一定是那些，
   不需要写出来。但形参的名字是不可省略的（因为要在方法体中使用）
   2. 特殊情况下：
      - 如果形参列表中的形参只有一个，那么()小括号，也是可以省略的。
      - 但是如果形参为空，()小括号是不可以省略的。

2. { //方法体 }方法体能不能简化呢？当然是可以的：

   1. 如果方法重写的方法体只有一条语句的话，那么可以省略大括号。（类似于if/for省略大括号）
   2. 特殊的，如果只有一条语句且这条语句是返回值语句，那么大括号和return可以一起省略。

3. 实际上在多数情况下，都不太可能一句话把方法体写完。
多数情况下，Lambda表达式的抽象方法实现都会很复杂，那这样Lambda表达式就会写的很复杂，这就很难受了。而Lambda表达式，本质上就是重写了一个抽象方法的子类对象，所以Java允许Lambda表达式的抽象方法的实现可以直接指向一个已经存在的方法，而不是自己书写实现。这种语法在Java中称之为"方法引用"！
 */
public class Demo {
    public static void main(String[] args) {
        INoReturnTwoParam iNoReturnTwoParam =
                (int a, int b) -> {
                    System.out.println(a + b);
                };
        iNoReturnTwoParam.test(1, 2);
        // 简化写法,形参列表的数据类型可以省略
        INoReturnTwoParam iNoReturnTwoParam1 =
                (m, n) -> {
                    System.out.println(m);
                    System.out.println(n);
                };
        iNoReturnTwoParam1.test(100, 200);


        System.out.println("-------");
        INoReturnOneParam ip =
                (int m) -> {
                    System.out.println(++m);
                };
        ip.test(10);
        // 简化写法
        // 如果形参列表中的形参只有一个，那么()小括号，也是可以省略的
        INoReturnOneParam ip2 =
                m -> {
                    System.out.println(++m);
                };
        ip.test(10);

        // 如果形参为空 ()不能省略
        INoReturnNoParam ip3 =
                () -> {
                    System.out.println("test1111111");
                };
        ip3.test();

        System.out.println("-------------");
        IHasReturnTwoParam ip4 =
                (a,b) -> {
                    int result = a+b;
                    return result;
                };
        int result = ip4.test(100, 200);
        System.out.println("result = " + result);
        // 简化写法
        // 如果方法重写的方法体只有一条语句的话，那么可以省略大括号 ,return 也可以省略
        IHasReturnTwoParam ip5 = (a, b) -> a + b;
        int sum = ip5.test(11, 11);
        System.out.println("sum = " + sum);

        // 方法体只有一条语句的话，那么可以省略大括号
        INoReturnNoParam ip6 = () -> System.out.println(1111111);

    }
}


//无返回值无参数的功能接口
@FunctionalInterface
interface INoReturnNoParam {
    void test();
}

//无返回值有一个参数的功能接口
@FunctionalInterface
interface INoReturnOneParam {
    void test(int a);
}

//无返回值两个参数的功能接口
@FunctionalInterface
interface INoReturnTwoParam {
    void test(int a, int b);
}

//有返回值无参数的功能接口
@FunctionalInterface
interface IHasReturnNoParam {
    int test();
}

//有返回值一个参数的功能接口
@FunctionalInterface
interface IHasReturnOneParam {
    int method(int a);
}

//有返回值两个参数的功能接口
@FunctionalInterface
interface IHasReturnTwoParam {
    int test(int a, int b);
}